from langchain_core.tools import tool
import requests
import geocode
from langchain_core.output_parsers import StrOutputParser
import llmShift


@tool
def search_images(query: str, num: int = 10, page: int = 1, type: int = 2, id: str = "10003706",
                  key: str = "b586c15edaf150b6b5cf2917c329119d"):
    """
    调用图片搜索接口。
    :param query: 查询关键词，如图片主题。
    :param num: 返回数量，默认为 10，最大 30。
    :param page: 翻页，默认为 1。
    :param type: 图片类型，1=预览图，2=源图，默认为 2。
    :param id: 接口盒子用户ID，默认为公共ID。
    :param key: 接口盒子用户KEY，默认为公共KEY。
    :return: 格式化后的图片地址列表。
    """
    print("已调用search_images")
    try:
        # 构造请求参数
        params = {
            "num": num,
            "id": id,
            "key": key,
            "words": query,
            "page": page,
            "type": type
        }

        # 发送请求
        response = requests.get("https://cn.apihz.cn/api/img/apihzimgsougou.php", params=params)
        response.raise_for_status()  # 检查请求是否成功
        data = response.json()

        # 格式化图片数据
        if data["code"] == 200:
            formatted_images = []
            for img_url in data.get("res", []):
                formatted_images.append(f"图片地址: {img_url}\n")
            return "\n".join(formatted_images)  # 返回格式化后的图片地址列表
        else:
            return f"Error: {data.get('msg', '未知错误')}"
    except requests.exceptions.RequestException as e:
        return f"Error fetching images: {e}"


@tool
def get_walking_route(origin: str, destination: str, isindoor: int = 0, alternative_route: int = 1):
    """
    高德地图步行路线规划。
    :param origin: 起点结构化地址信息，例如“北京市朝阳区阜通东大街6号”。
    :param destination: 目的地结构化地址信息，例如“北京市朝阳区阜通东大街6号”。
    :param isindoor: 是否需要室内算路，默认为0（不需要）。
    :param alternative_route: 返回路线条数，默认为1（返回一条路线）。
    :return: 格式化后的步行路线规划结果。
    """
    print("已调用get_walking_route")
    try:
        # 构造请求参数
        ORI = geocode.geocode(address=origin)
        DES = geocode.geocode(address=destination)
        params = {
            "key": '15b4ad5020694dbd091886d7d9d24bb9',
            "origin": ORI['location'],
            "destination": DES['location'],
            "isindoor": isindoor,
            "alternative_route": alternative_route
        }

        # 发送请求
        response = requests.get("https://restapi.amap.com/v5/direction/walking", params=params)
        response.raise_for_status()  # 检查请求是否成功
        data = response.json()

        # 格式化结果
        if data["status"] == "1" and data["infocode"] == "10000":
            routes = data["route"]["paths"][0]
            formatted_routes = []
            # print(f'routes:{routes}')
            distance = routes["distance"]
            duration = routes["cost"]["duration"]
            # print(f'总路程{distance}米\n大概需要{duration}秒')
            formatted_routes.append(f'总路程{distance}米\n大概需要{duration}秒')
            steps = routes["steps"]
            for step in steps:
                formatted_routes.append(f"{step['instruction']}\n")
            return "\n".join(formatted_routes)
        else:
            return f"Error: {data.get('info', '未知错误')}"
    except requests.exceptions.RequestException as e:
        return f"Error fetching walking route: {e}"


@tool
def get_transit_route(location_list: list, mode: int = 0):
    """
    高德地图多地点之间的公共交通路线规划。
    :param location_list: 地点名称列表，例如['城隍庙','东方明珠','外滩','上海科技馆']。
    :param mode: 0：总路程最短 1：总步行距离最短
    :return: 格式化后的公交路线规划结果。
    """
    print("已调用get_transit_route")
    import itertools
    import transitRoute
    distances = {location: {} for location in location_list}

    # 获取每对地点之间的距离信息
    for start in location_list:
        for end in location_list:
            if start == end:
                continue
            distance, walking_distance = transitRoute.get_transit_route(origin=start, destination=end, tool=True)
            distances[start][end] = {"total_distance": distance, "total_walking": walking_distance}

    # 穷举所有可能的路径
    best_route = None
    best_score = float('inf')
    best_route_details = []

    for perm in itertools.permutations(location_list):
        total_distance = 0
        total_walking = 0
        route_details = []

        for i in range(len(perm) - 1):
            start = perm[i]
            end = perm[i + 1]
            route_info = distances[start][end]
            total_distance += route_info["total_distance"]
            total_walking += route_info["total_walking"]
            route_details.append({
                "start": start,
                "end": end,
                "total_distance": route_info["total_distance"],
                "total_walking": route_info["total_walking"]
            })

        # 根据模式选择最优路径
        if mode == 0:  # 总路程最短
            if total_distance < best_score:
                best_score = total_distance
                best_route = perm
                best_route_details = route_details
        elif mode == 1:  # 总步行距离最短
            if total_walking < best_score:
                best_score = total_walking
                best_route = perm
                best_route_details = route_details

    # 格式化输出结果
    result = {
        "best_route": " -> ".join(best_route),
        "best_score": best_score,
        "mode": "总路程最短" if mode == 0 else "总步行距离最短",
        "route_details": best_route_details
    }
    return result


@tool
def get_scenic_spots(location: str, num: int):
    """
    景点推荐。
    :param location: 目标地区。
    :param num: 需要获取的景点个数。
    """
    print("已调用get_scenic_spots")
    prompt = f'''
        **请严格按照以下要求执行：**

        1. **目标地区**：中国[{location}]
        2. **输出数量**：列出前[{num}]个
        3. **数据权威性**：优先选用国家5A/4A级景区或文化/自然遗产地
        4. **输出格式**：
        ```markdown
        ### [序号]. [景点全称]
        - **位置**：[省/市/具体位置]（精确到地级市）
        - **等级**：[5A/4A/世界遗产/国家级等]（若已知）
        - **特色标签**：[自然风光/人文历史/亲子休闲/网红打卡等]（1-3个）
        - **核心描述**：
          - 50-100字简介（突出历史背景/自然特征）
          - 1-2个最具代表性的特色（如独特景观、世界之最、文化价值等）
        ```

        **示例输出**（以默认参数为例）：
        ```markdown
        ### 1. 故宫博物院
        - **位置**：北京市东城区
        - **等级**：国家5A级景区、世界文化遗产
        - **特色标签**：人文历史、建筑奇观
        - **核心描述**：
          - 中国明清两代的皇家宫殿，世界上现存规模最大、保存最完整的木质结构古建筑群。
          - 拥有180余万件珍贵文物，太和殿、乾清宫等代表中国古代建筑艺术巅峰。
        ```

        **特别要求**：
        1. 确保地理位置准确性（如区分"黄山市黄山风景区"与"黄山山脉"）
        2. 避免主题公园/商业综合体类景点（除非具有重大文化意义）
        3. 对少数民族地区景点需注明文化特色（如藏族、傣族等）
        4. 如该地区知名景点不足{num}个，如实说明并补充推荐邻近区域景点

        **请确认目标地区和数量后开始生成**：
    '''
    messages = [
        {
            "role": "system",
            "content": f"{prompt}"
        }
    ]
    chain = (llmShift.version_choose() | StrOutputParser())
    return chain.invoke(messages)


@tool
def get_douyin_hot(num: int):
    """
    抖音热点视频话题获取
    :param num 获取前几条
    """
    try:
        response = requests.get("https://whyta.cn/api/tx/douyinhot?key=d5c296b91907")
        response.raise_for_status()  # 检查请求是否成功
        data = response.json()
        if data["code"] == 200:
            hot_list = data['result']['list']
            # 示例1：按热度排序（从高到低）
            sorted_list = sorted(hot_list, key=lambda x: x['hotindex'], reverse=True)
            return sorted_list[:num]
        else:
            return f"Error: {data['msg']}"
    except requests.exceptions.RequestException as e:
        return f"{e}"
